package com.sun.jdk.date.jdk8after;

import java.time.*;
import java.util.Date;

/**
 * 二十五、java.util.Date转换为java.time.LocalDate（1）
 *
 * 对于老项目的改造，需要将Date或者Calendar转换为java.util包中相应的类的，可以根据本小节中提供的方法进行改造。
 *
 * Java8中的java.time中并没有提供太多的内置方式来转换java.util包中用预处理标准日期和时间的类，我们可以使用Instant类作为中介，也可以使用java.sql.Date和java.sql.TimeStamp类提供的方法进行转换。
 *
 * 使用Instant类将java.util.Date转换为java.time.LocalDate
 *
 * java.time包中并没有提供很多的方式来进行直接转换，但是给之前的Date类，Calendar类在java1.8都提供了一个新的方法，叫做toInstant()，可以将当前对象转换为Instant对象，通过给Instan添加时区信息之后就可以转换为LocalDate对象。
 *
 * 作者：一双看向未来的眼睛
 * 链接：https://www.jianshu.com/p/7a1b367ae95f
 * 来源：简书
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class Java8DateToLocalDateDemo1 {

    /**
     * java.util.Date转换为java.time.LocalDate 第一种方式
     */
    private static void test1(){
        // Java8之前的日期类,Date类包含日期和时间信息，但是不包含时区信息
        Date date = new Date();

        // Java8时，给Date对象提供了一个toInstant方法
        Instant instant = date.toInstant();

        // 给Instant对象添加一个时区信息，就可以得到带时区的ZoneDateTime,然后再通过ZoneDateTime转换成LocalTime、LocalDate或LocalDateTime
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

        // 通过ZoneDateTime转换成LocalTime、LocalDate或LocalDateTime
        LocalDate toLocalDate = zonedDateTime.toLocalDate();
        LocalTime toLocalTime = zonedDateTime.toLocalTime();
        LocalDateTime toLocalDateTime = zonedDateTime.toLocalDateTime();

        System.out.println("date = " + date);
        System.out.println("instant = " + instant);
        System.out.println("zonedDateTime = " + zonedDateTime);
        System.out.println("toLocalDate = " + toLocalDate);
        System.out.println("toLocalTime = " + toLocalTime);
        System.out.println("toLocalDateTime = " + toLocalDateTime);

    }

    /**
     * java.util.Date转换为java.time.LocalDate 第一种方式
     */
    private static void test2(){

        // 封装java.util.Date对象
        Date date = new Date();
        // 先将java.util.Date对象转换成java.sql.Date对象
        java.sql.Date sqlDate = new java.sql.Date(date.getTime());
        // 通过java.sql.Date转换成LocalDate
        LocalDate localDate = sqlDate.toLocalDate();

        System.out.println("date = " + date);
        System.out.println("sqlDate = " + sqlDate);
        System.out.println("localDate = " + localDate);
    }

    public static void main(String[] args) {
        test1();
        System.out.println("------");
        test2();
    }
}
